#!/usr/bin/perl
#
# Script para obtener las Reservas activas del DHCP
#
# Argumentos:
#  1) Fichero del que obtener la lista
#  2) Columna por la que ordenar la salida
#
# Ejemplos:
#  Por tiempo (3) o (-3:inverso)
#    getFixedAliasesDroped.pl /etc/AGEDABOX.MacsRegistered 3 
#
#  Por MAC (4) o (-4:inverso)
#    getFixedAliasesDroped.pl /etc/AGEDABOX.MacsRegistered 4
#
#  Por Nombre (2) o (-2:inverso)
#    getFixedAliasesDroped.pl /etc/AGEDABOX.MacsRegistered 2
#
#
# Formato de salida:
#  IP#MAC#Nombre#Fecha#
#
 
 # Comprobar argumentos del script
 if ( 1 != $#ARGV ) {
    print STDERR "ERROR: Faltan argumentos. Debes pasar el <fichero> <orden> \n";
    exit 2;
 }

 # Recoger agumentos -----------------
 
 # Fichero de leases
 $leases=$ARGV[0];

 # Como ordenar
 $OptsReverse="";
 if ( 0 < $ARGV[1] ) {
    $OptsReverse="-r";
 }

 # Campo por ordenar...
 if ( ( 2 == $ARGV[1] ) || ( -2 == $ARGV[1] ) ) {
    # Por MAC
    $OptsOrder="-t# -k2"
 }elsif ( ( 1 == $ARGV[1] ) || ( -1 == $ARGV[1] ) ) {
    # Por Nombre
    $OptsOrder="-t# -k3"
 } else {
    # Por defecto...
    $OptsOrder="-t# -k1"
 }
 
 # Para obtener las ruta absoluta del directorio de los scripts
 use File::Basename;
 use Cwd 'abs_path';
 $dirname=dirname(abs_path($0));

 # Para los temporales
 $rnd=rand(1000000);
 $tmpFile="/tmp/getFixedDroppedAliases_$$_$rnd";

 # Construir el comando inicial para quedarnos con las entras unicas ...
 # ...por MAC, y quedandonos con la ultima concesion
 $comando="perl $dirname/formatFixedAliasesDroped.pl $ARGV[0] | sort -t# -r -k2 -k1 ";
 open(CMD,"$comando |") || die ("ERROR: No puedo ejecutar el comando embebido\n"); 

 # Crear el temporal para luego ordenar
 open(TMP,">$tmpFile") || die("ERROR: No puedo crear [$tmpFile]\n");

 # Recorrer la salida para ir metiendo en el hash
 $lastMAC="";
 while ( chomp($linea=<CMD>) ) {
     # Troceamos la linea
     @leas=split("#",$linea);
     if ( $lastMAC ne $leas[2] ) {
        $lastMAC=$leas[2];
        print TMP "$linea\n";
     }
 }
 close(CMD);
 close(TMP);

 # Ahora ordenamos como nos pidieron y formateamos la salida...
 open(CMD,"sort $OptsReverse $OptsOrder $tmpFile |") || die ("ERROR: No puedo ordenar [$tmpFile]\n"); 
 while ( chomp($linea=<CMD>) ) {
     # Troceamos la linea
     @leas=split("#",$linea);

     $nombre=$leas[3];
     if ("..SIN_NOMBRE.." eq $leas[3]) {
        $nombre="";
     }
     print $leas[1] . "#". $leas[2] . "#". $leas[3] ."#\n";
 }
 close(CMD);

 # Borrar el temporal...
 unlink($tmpFile);
